8805
10012
Esta pregunta ya tiene respuestas aquí:
Sin conversión implícita en el operador sobrecargado
(2 respuestas)
Cerrado hace 7 años.
Estoy escribiendo un contenedor simple para un tipo elemental y estoy tratando de evitar tener que escribir demasiados tipos de operadores estándar. Esperaba que la conversión de tipos implícita ayudara, pero no es así. Aquí hay un ejemplo simplificado:
estructura Int
{
int _i;
Int (int i = 0): _i {i} {}
Int operador + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(vacío) (Int (1) + 2); // Multa
(vacío) (2 + Int (1)); // error: operandos no válidos para la expresión binaria ('int' e 'Int')
}
Estoy usando llvm. La primera línea de main se compila bien. El segundo provoca un error. Ahora, lo que esperaba que sucediera en la segunda línea es que 2 se convertiría implícitamente en Int (2), seguido de una llamada al operador +. ¿Por qué no está pasando eso? ¿Por qué ocurre la conversión implícita en la primera línea? 
Ocurre en la primera línea porque el único operador + disponible es operator + (Int &) (que tiene un primer parámetro implícito de Int para esta instancia). La segunda línea falla porque el primer parámetro es un int y no tiene idea de que necesita convertirlo antes de intentar la operación (no sabe que necesita usar Int :: operator +).
Puede evitar ese problema convirtiendo al operador en una función de amigo no miembro (http://ideone.com/YCf7wX)
estructura Int
{
int _i;
Int (int i = 0): _i {i} {}
amigo Int operador + (const Int & lhs, const Int & rhs);
};
Int operador + (const Int & lhs, const Int & rhs)
{
return lhs._i + rhs._i;
}
int main ()
{
Int i;
i + 5;
5 + i;
return 0;
}
|
No es la respuesta que estás buscando? Explore otras preguntas etiquetadas c ++ operator-keyword implicit-conversion o haga su propia pregunta